BaBar $\sigma(e^+e^- \rightarrow \pi^+\pi^- (\gamma))$

29 Apr 2019

The latest BaBar measurements are published in two papers that point to exatly the same supplemental data

  • B. Aubert et al. [BaBar Collaboration], Phys. Rev. Lett. 103 (2009) 231801, inspirehep,
    "Precise measurement of the e+ e- ---> pi+ pi- (gamma) cross section with the Initial State Radiation method at BABAR"

  • J. P. Lees et al. [BaBar Collaboration], Phys. Rev. D 86 (2012) 032013, inspirehep,
    "Precise Measurement of the e+e−→π+π−(γ)e+e−→π+π−(γ) Cross Section with the Initial-State Radiation Method at BABAR"

The data report the "bare cross section including FSR" and in detail:

  • the cross-section and its total undertainty in variable-width bins of energy
  • the per-mil relative systematic uncertainty (per energy bin, 100% correlated on all bins)
  • the statistical correlation between any two bins of cross-section

In the following the data are used to show a few plots.

In [1]:
library(repr, quietly=TRUE)
library(ggplot2, quietly=TRUE)
library(scales, quietly=TRUE)
library(RColorBrewer, quietly=TRUE)
library(latex2exp, quietly=TRUE)
library(rminuit2, quietly=TRUE)
library(Cairo, quietly=TRUE)
library(svglite, quietly=TRUE)
library(stringr, quietly=TRUE)
In [2]:
##
## open graphic device
##

my.width = 9
my.height = 5
my.width.pixels = 560

rc = try(dev.off(), silent=TRUE)
## rc = dev.new(width=my.width, height=my.height, dpi = my.width.pixels / my.width)
rc = dev.new(width=my.width, height=my.height, dpi = my.width.pixels / my.width)
In [3]:
##
## jupyter options
##
options(repr.plot.width=my.width, repr.plot.height = my.height, repr.plot.res = 100)
options(jupyter.plot_mimetypes = "image/svg+xml")
## options(jupyter.plot_mimetypes = "image/png")
In [4]:
##
## plot functions
## see http://t-redactyl.io/blog/2016/03/creating-plots-in-r-using-ggplot2-part-9-function-plots.html
##

##--- configure ggplot2 theme
theme_set(theme_bw(base_size = 15, base_family = "Helvetica"))
theme_update(
  ## plot.title = element_text(face="bold", vjust=1),
  panel.background = element_rect(fill = "transparent",colour = NA),
  plot.background = element_rect(fill = "transparent",colour = NA),
  NULL
)
In [5]:
##
## save last plot
##
save_plot = function(name, plot = last_plot(), width=my.width, height=my.height, horiz.pixels=my.width.pixels) {
  name = paste0("", name)
  dpi = my.width.pixels/my.width
  
  file.png = paste(name, "png", sep=".")
  suppressWarnings(ggsave(filename=file.png, width=width, height=height, dpi=dpi, bg = "transparent"))
  cat(file=stderr(), "file", file.png, "produced\n")
  
  file.pdf = paste(name, "pdf", sep=".")
  suppressWarnings(ggsave(filename=file.pdf, width=width, height=height, dpi=dpi, bg = "transparent"))
  cat(file=stderr(), "file", file.pdf, "produced\n")
  
  file.svg = paste(name, "svg", sep=".")
  suppressWarnings(ggsave(filename=file.svg, width=width, height=height, dpi=dpi, bg = "transparent"))
  cat(file=stderr(), "file", file.svg, "produced\n")
}
In [6]:
##--- get all data
babar09_lines = readLines("babar-2009/BABAR_ISR2pi_EPAPS.txt")
In [7]:
##--- get begin and end of data sections
babar09_beg = grep("^\\*\\*\\*\\*\\*\\*\\*\\*", babar09_lines)
babar09_end = c( tail(babar09_beg, -1), length(babar09_lines))
In [8]:
##--- get total systematic uncertainties
rc = str_match(babar09_lines[babar09_beg[2]:babar09_end[2]], "^\\s*(\\S+)\\s*:\\s*(\\S+)\\s+(\\S+)\\s+(\\S+)")
rc = rc[!is.na(rc[,1]), ]
df = data.frame(
  E_l = as.numeric(rc[, 2]),
  E_h = as.numeric(rc[, 3]),
  sigma = as.numeric(rc[, 4]),
  sigma_unc = as.numeric(rc[, 5])
)
df = within(df, {
  E = (E_l+E_h)/2
})
In [9]:
##--- get low/high E bins limits
rc = str_match(babar09_lines[babar09_beg[3]:babar09_end[3]],
               paste0("^\\s*", paste(rep("([^-]+)-([^-\\s]+)", 8), collapse="\\s+")))
rc = rc[!is.na(rc[,1]), ]
rc = as.numeric(tail(rc, -1))
df_syst = data.frame(
  E_l = rc[seq(1, length(rc), 2)],
  E_h = rc[seq(2, length(rc), 2)]
)
##--- get permil systematic uncertainty
rc = str_match(babar09_lines[babar09_beg[3]:babar09_end[3]],
               paste0("^\\s*", paste(rep("\\(([^\\)]+)\\)", 8), collapse="\\s+")))
rc = rc[!is.na(rc[,1]), ]
df_syst$unc_permil = as.numeric(tail(rc, -1))
df_syst
E_lE_hunc_permil
0.3 0.4 13.8
0.4 0.5 8.1
0.5 0.6 10.2
0.6 0.9 5.0
0.9 1.2 6.5
1.2 1.4 13.9
1.4 2.0 19.8
2.0 3.0 52.4
In [10]:
##--- get statistical covariance
rc = str_match(babar09_lines[babar09_beg[4]:babar09_end[4]], "^\\s*([0-9\\.Ee\\+\\-]+)")
rc = as.numeric(rc[!is.na(rc[,1]), -1])
stat_cov = matrix(rc, nrow=nrow(df), ncol=nrow(df))
## str(stat_cov)
df_stat = expand.grid(E_x=df$E, E_y=df$E)
df_stat$unc = rc
## str(df_stat)
In [11]:
##
## plot sigma(e+e- -> pi+pi-)
##
ggplot(df, aes(x = E, y = sigma)) +
  ggtitle(TeX("$e^+e^- - \\pi^+\\pi^- (\\gamma)$")) +
  geom_point(size=1) +
  geom_errorbar(aes(ymin=sigma-sigma_unc, ymax=sigma+sigma_unc)) +
  scale_x_continuous(name = TeX("E \\[GeV\\]"), breaks=pretty_breaks(7)) +
  scale_y_continuous(name = TeX("$d\\sigma/dE$"),
                     breaks=pretty_breaks(7)) +
  NULL
save_plot("babar09-pippim")
getOption("jupyter.plot_mimetypes")
'image/svg+xml'
In [12]:
##
## plot sigma(e+e- -> pi+pi-) at rho peak
##
ggplot(df, aes(x = E, y = sigma)) +
  ggtitle(TeX("$e^+e^- \\rightarrow \\pi^+\\pi^- (\\gamma)$")) +
  geom_point(size=1) +
  geom_errorbar(aes(ymin=sigma-sigma_unc, ymax=sigma+sigma_unc)) +
  scale_x_continuous(name = TeX("E \\[GeV\\]"), breaks=pretty_breaks(7)) +
  scale_y_continuous(name = TeX("$d\\sigma/dE$"), breaks=pretty_breaks(7)) +
  coord_cartesian(xlim=c(0.65, 0.85)) +
  NULL
In [13]:
##
## plot statistical correlation at the rho peak
##
Emin = 0.6
Emax = 0.85
df_stat_rhopeak = subset(df_stat, E_x >= Emin & E_x <= Emax & E_y >= Emin & E_y <= Emax)
ggplot(df_stat_rhopeak, aes(x=E_x, y=E_y, unc)) + geom_tile(aes(fill = unc)) +
  ggtitle(TeX("$e^+e^- \\rightarrow \\pi^+\\pi^- (\\gamma)$ statistical covariance")) +
  scale_fill_gradient(low="white", high="steelblue") +
  NULL